# Define packages
packages = c("dplyr","tidyr", # data manipulation
"rgdal","maptools", # shapefiles
"leaflet","leaflet.extras","leaflet.minicharts", # maps
"RColorBrewer", # colors palettes
"plyr", # easy merge
"stringr") # strings manipulation
# Attach packages
invisible(suppressMessages(lapply(packages, library, character.only = T)))
# Define working directory
csv_cd = "C:/Users/lgoye/OneDrive/documents/GitHub/hw02_lgoyenec/data_csv"
shp_cd = "C:/Users/lgoye/OneDrive/documents/GitHub/hw02_lgoyenec/data_shp"
# Import data
crimes = read.csv(paste0(csv_cd, "/crimes_2018.csv"))
police = read.csv(paste0(csv_cd, "/police_stations.csv"))
# Import shapefiles
sh_bound = readOGR(dsn = shp_cd,
layer = "police_beats",
verbose = F)
sh_bikes = readOGR(dsn = shp_cd,
layer = "bike_routes",
verbose = F)
# All variables in lower case
names(crimes) = tolower(names(crimes))
names(police) = tolower(names(police))
# Choosing variables of interest
crimes =
crimes %>%
select(date,
primary.type,
location.description,
arrest, domestic,
beat, district, ward, community.area,
x.coordinate, y.coordinate, latitude, longitude)
police =
police %>%
select(`ï..district`, district.name,
wards,
x.coordinate, y.coordinate, latitude, longitude) %>%
dplyr::rename(ward = wards) %>%
# Changes on district variable for polylines map
dplyr::rename(district = `ï..district`) %>%
mutate(district = as.numeric(ifelse(district == "Headquarters", 0, district)))
# Construct final data based on interest of analysis::
# Select Primary Type of interest and create categorical variable:
# Homicide
# Human Trafficking
# Kidnapping
# Narcotics
data =
crimes %>%
filter(
primary.type %in%
c("HOMICIDE",
"HUMAN TRAFFICKING",
"KIDNAPPING",
"PROSTITUTION")
) %>%
mutate(
crime_type =
ifelse(primary.type == "HOMICIDE", 1,
ifelse(primary.type == "HUMAN TRAFFICKING", 2,
ifelse(primary.type == "KIDNAPPING", 3, 4)))
)
Maps
Map 1:
Basemap
leaflet() %>%
addTiles() %>%
addProviderTiles(provider = "Esri.WorldGrayCanvas", group = "World Gray") %>%
addTiles(group = "OSM (default)") %>%
addProviderTiles("CartoDB.DarkMatterNoLabels" , group = "World Dark") %>%
addProviderTiles(provider = "Esri.WorldStreetMap" , group = "World StreetMap") %>%
addProviderTiles(provider = "Esri.WorldImagery" , group = "World Imagery") %>%
addPolygons(data = sh_bound,
color = "white", weight = 1,
fillColor = "black", fillOpacity = 0.2) %>%
addLayersControl(
baseGroups = c("World Gray","OSM (default)","World Dark","World StreetMap","World Imagery"),
options = layersControlOptions(collapsed = F),
position = "bottomright")
Map 1:
Distribution of total crimes in 2018 across police beats
# Count number of crimes per beat
data_beats =
data %>%
group_by(beat) %>%
dplyr::summarise(n = n()) %>%
dplyr::rename(beat_num = beat)
# Merge data_beats with shaapefile
map_beats = sh_bound
map_beats@data = merge(map_beats@data, data_beats, id = "beat_num")
# Generate the bins for the graph
dom = map_beats$n
bin = quantile(dom, na.rm = T)
bin[1] = 0
pal = colorBin("Reds", domain = dom, bins = bin, na.color = "#FFFDFC")
# Map with pop ups
leaflet(map_beats) %>%
addTiles(group = "OSM (default)") %>%
addProviderTiles("CartoDB.DarkMatterNoLabels" , group = "World Dark") %>%
addProviderTiles(provider = "Esri.WorldStreetMap", group = "World StreetMap") %>%
addProviderTiles(provider = "Esri.WorldImagery" , group = "World Imagery") %>%
addPolygons(
fillColor =~ pal(dom), fillOpacity = 0.8,
color = "white", weight = 0.3,
stroke = T, smoothFactor = 0.2,
popup = paste("Number of crimes:", map_beats$n)) %>%
addLayersControl(
baseGroups = c("OSM (default)","World Dark","World StreetMap","World Imagery"),
options = layersControlOptions(collapsed = F),
position = "bottomright")
Map 2
Distribution of homicides, human traffickig, Kidnapping and Prostitution in 2018 across Chicago
# Create palette for crime type
pal = colorFactor(c("#3C153B","#F46036","#1B998B","#0079AD"), unique(data$crime_type))
# Map for 4 different crimes
leaflet() %>%
addTiles() %>%
addProviderTiles(provider = "Esri.WorldGrayCanvas", group = "World Gray") %>%
addTiles(group = "OSM (default)") %>%
addProviderTiles("CartoDB.DarkMatterNoLabels" , group = "World Dark") %>%
addProviderTiles(provider = "Esri.WorldStreetMap" , group = "World StreetMap") %>%
addProviderTiles(provider = "Esri.WorldImagery" , group = "World Imagery") %>%
addPolygons(data = sh_bound,
color = "white", weight = 1,
fillColor = "black", fillOpacity = 0.2) %>%
addCircleMarkers(data = data,
lng =~ longitude, lat =~ latitude,
color =~ pal(crime_type), fillOpacity = 1,
radius = 1, stroke = T) %>%
addLegend(title = "",
colors = c("#3C153B", "#F46036", "#1B998B", "#0079AD"),
labels = c("Homicide", "Human Trafficking", "Kidnapping", "Prostitution"),
opacity = 1) %>%
addLayersControl(
baseGroups = c("World Gray","OSM (default)","World Dark","World StreetMap","World Imagery"),
options = layersControlOptions(collapsed = F),
position = "bottomright")
Map 3
Distance between police stations and kidnapping crimes
data_kidna =
crimes %>%
filter(primary.type == "ASSAULT", arrest == "true") %>%
select(latitude, longitude)
leaflet() %>%
addProviderTiles(provider = "Esri.WorldGrayCanvas", group = "World Gray") %>%
addTiles(group = "OSM (default)") %>%
addProviderTiles("CartoDB.DarkMatterNoLabels" , group = "World Dark") %>%
addProviderTiles(provider = "Esri.WorldStreetMap" , group = "World StreetMap") %>%
addProviderTiles(provider = "Esri.WorldImagery" , group = "World Imagery") %>%
addPolygons(data = sh_bound,
color = "white", weight = 1,
fillColor = "#202030", fillOpacity = 0.6) %>%
addPolylines(data = sh_bikes,
color = "#F5BB00",
weight = 1.5,
group = "Bike Routes") %>%
addCircleMarkers(data = data_kidna,
lng =~ longitude, lat =~ latitude,
color = "#BA1200", fillOpacity = 1,
radius = 0.2, stroke = F) %>%
addCircleMarkers(data = police,
lng =~ longitude, lat =~ latitude,
color = "#2A4494", fillOpacity = 0.5,
radius = 15, stroke = T, weight = 1.5,
group = "Police Radius") %>%
addLayersControl(
baseGroups = c("World Gray","OSM (default)","World Dark","World StreetMap","World Imagery"),
overlayGroups = c("Police Radius", "Bike Routes"),
options = layersControlOptions(collapsed = F),
position = "bottomright") %>%
hideGroup("Bike Routes")